package com.zjsru.plan2024.oneday;

/**
 * 3226. 使两个整数相等的位更改次数
 *
 * @Author: cookLee
 * @Date: 2024-11-02
 */
public class MinChanges {

    /**
     * 主
     * 你可以选择 n 的 二进制表示 中任意一个值为 1 的位，并将其改为 0。
     * 返回使得 n 等于 k 所需要的更改次数。如果无法实现，返回 -1
     * <p>
     * \
     * 输入： n = 13, k = 4
     * <p>
     * 输出： 2
     * <p>
     * 解释：
     * 最初，n 和 k 的二进制表示分别为 n = (1101)2 和 k = (0100)2，
     * <p>
     * 我们可以改变 n 的第一位和第四位。结果整数为 n = (0100)2 = k。
     * \
     * 输入： n = 14, k = 13
     * 输出： -1
     * 解释：
     * 无法使 n 等于 k。
     * \
     *
     * @param args args
     */
    public static void main(String[] args) {
        MinChanges minChanges = new MinChanges();
        int n = 13, k = 4;
        System.out.println(minChanges.minChanges(n, k));
    }

    /**
     * 最小值变化
     *
     * @param n n
     * @param k k
     * @return int
     */
    public int minChanges(int n, int k) {
        int count = 0;
        if (n == k) {
            return count;
        }
        while (n > 0 || k > 0) {
            //n 的每位只能由1改为0
            if ((n & 1) == 0 && (k & 1) == 1) {
                return -1;
            }
            if ((n & 1) == 1 && (k & 1) == 0) {
                count++;
            }
            // 位运算
            k >>= 1;
            n >>= 1;
        }
        return count;
    }

    /**
     * 最小更改2
     *
     * @param n n
     * @param k k
     * @return int
     */
    public int minChanges2(int n, int k) {
        return (n & k) == k ? Integer.bitCount(n ^ k) : -1;
    }

}
